/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pe.edu.upc.dew.serviciosmultiples.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import pe.edu.upc.dew.serviciosmultiples.exception.DAOException;
import pe.edu.upc.dew.serviciosmultiples.model.Servicio;
import pe.edu.upc.dew.serviciosmultiples.model.Solicitud;
import pe.edu.upc.dew.serviciosmultiples.model.Usuario;

/**
 *
 * @author bcano
 */
public class SolicitudDAOImpl extends BaseDAO implements SolicitudDAO{

    private DataSource dataSource;

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public List<Solicitud> listarSolicitudesPorServicio(Solicitud solicitud) throws DAOException {
        String query = "select s.idSolicitud, s.fechaSolicitud, s.estado, s.problema, s.costoSolicitud, s.costoSolicitud,"
                     + " tp.descripcion, u.nombreUsuario, u.apellidoUsuario"
                     + " from solicitud s inner join usuario u on s.idUsuario = u.idUsuario"
                     + " inner join servicio tp on s.idServicio = tp.idServicio"
                     + " where s.idUsuario =? and s.idServicio =? order by s.idSolicitud";
        List<Solicitud> lista = new ArrayList<Solicitud>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, solicitud.getUsuario().getIdUsuario());
            stmt.setInt(2, solicitud.getServicio().getIdServicio());
            rs = stmt.executeQuery();
            while (rs.next()) {

                Solicitud vo = new Solicitud();
                vo.setIdSolicitud(rs.getInt("idSolicitud"));
                vo.setFechaSolicitud(rs.getDate("fechaSolicitud"));
                vo.setEstado(rs.getString("estado"));
                vo.setCostoSolicitud(rs.getDouble("costoSolicitud"));
                vo.setProblema(rs.getString("problema"));
                vo.setCostoSolicitud(rs.getDouble("costoSolicitud"));

                Servicio voS = new Servicio();
                voS.setDescripcion(rs.getString("descripcion"));
                vo.setServicio(voS);
                
                Usuario voU = new Usuario();
                voU.setNombreUsuario(rs.getString("nombreUsuario"));
                voU.setApellidoUsuario(rs.getString("apellidoUsuario"));
                vo.setUsuario(voU);

                lista.add(vo);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOException(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println(lista.size());
        return lista;
    }

    @Override
    public List<Solicitud> listarSolicitudesPendientes(String estado) throws DAOException {
        String query = "select s.idSolicitud, s.fechaSolicitud, u.nombreUsuario, u.apellidoUsuario, st.descripcion, s.problema"
                     + " from solicitud s inner join usuario u on s.idusuario = u.idusuario"
                     + " inner join servicio st on s.idServicio = st.idServicio"
                     + " where s.estado =? order by s.idSolicitud";
     
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<Solicitud> lista = new ArrayList<Solicitud>();
        
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, estado);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Solicitud vo = new Solicitud();
                vo.setIdSolicitud(rs.getInt("idSolicitud"));
                vo.setFechaSolicitud(rs.getDate("fechaSolicitud"));
                vo.setProblema(rs.getString("problema"));

                Usuario voUsu = new Usuario();
                voUsu.setNombreUsuario(rs.getString("nombreUsuario"));
                voUsu.setApellidoUsuario(rs.getString("apellidoUsuario"));
                vo.setUsuario(voUsu);

                Servicio voTS = new Servicio();
                voTS.setDescripcion(rs.getString("descripcion"));
                vo.setServicio(voTS);

                lista.add(vo);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOException(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println("lista pendientes: " + lista.size());
        return lista;
    }

    @Override
    public Solicitud obtenerSolicitud(String idSolicitud) throws DAOException {
        String query = "select s.idSolicitud, s.fechaSolicitud, u.nombreUsuario, u.apellidoUsuario, st.descripcion,"
                     + " st.idServicio, s.problema, s.horas, s.costoSolicitud"
                     + " from solicitud s inner join usuario u on s.idUsuario = u.idUsuario"
                     + " inner join servicio st on s.idServicio = st.idServicio"
                     + " where s.idSolicitud =?";
        Solicitud vo = new Solicitud();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, idSolicitud);
            rs = stmt.executeQuery();
            if (rs.next()) {
                vo = new Solicitud();
                vo.setIdSolicitud(rs.getInt("idSolicitud"));
                vo.setFechaSolicitud(rs.getDate("fechaSolicitud"));
                vo.setStrFechaSolicitud(rs.getString("fechaSolicitud"));
                vo.setCostoSolicitud(rs.getDouble("costoSolicitud"));
                vo.setHoras(rs.getString("horas"));
                vo.setProblema(rs.getString("problema"));

                Usuario voUsu = new Usuario();
                voUsu.setNombreUsuario(rs.getString("nombreUsuario"));
                voUsu.setApellidoUsuario(rs.getString("apellidoUsuario"));
                vo.setUsuario(voUsu);

                Servicio voTS = new Servicio();
                voTS.setIdServicio(rs.getInt("idServicio"));
                voTS.setDescripcion(rs.getString("descripcion"));
                vo.setServicio(voTS);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOException(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println(vo);
        return vo;
    }

    @Override
    public Boolean validarDobleSolicitud(Solicitud solicitud) throws DAOException {
        String query = "select s.idSolicitud from solicitud s "
                     + "where s.idUsuario =? and s.idServicio=? "
                     + "and s.fechaSolicitud =?";
                    //  + "and s.fechaSolicitud =? and s.horas =?";

        boolean rpta = false;
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, solicitud.getUsuario().getIdUsuario());
            stmt.setInt(2, solicitud.getServicio().getIdServicio());
            stmt.setDate(3, solicitud.getFechaSolicitud());
           // stmt.setString(4, solicitud.getHoras());

            rs = stmt.executeQuery();
            if (rs.next()) {
               rpta = true;
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOException(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println("doble solicitud : " + rpta);
        return rpta;
    }

    @Override
    public Solicitud insertarSolicitud(Solicitud vo) throws DAOException {
        String query = "INSERT INTO solicitud (fechaSolicitud,problema,estado,horas,costoSolicitud,idUsuario,idServicio,usuCreacion,fechaCreacion) " +
			" VALUES (?,?,?,?,?,?,?,?,?)";
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setDate(1, vo.getFechaSolicitud());
            stmt.setString(2, vo.getProblema());
            stmt.setString(3, vo.getEstado());
            stmt.setString(4, vo.getHoras());
            stmt.setDouble(5, vo.getCostoSolicitud());
            stmt.setInt(6, vo.getUsuario().getIdUsuario());
            stmt.setInt(7, vo.getServicio().getIdServicio());
            stmt.setString(8, vo.getUsuCreacion());
            stmt.setDate(9, vo.getFechaCreacion());


            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo insertar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOException(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

     @Override
    public Boolean validarTecnicoDisponible(Solicitud solicitud) throws DAOException {
        String query = "select s.idSolicitud from solicitud s"
                      +" where s.idtecnico =? and s.fechasolicitud =? and s.horas =?";
                    //  + "and s.horasfinal =?";

        boolean rpta = false;
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, solicitud.getTecnico().getIdTecnico());
            stmt.setDate(2, solicitud.getFechaSolicitud());
            stmt.setString(3, solicitud.getHoras());
           // stmt.setString(4, solicitud.getHorasFinal());

            rs = stmt.executeQuery();
            if (rs.next()) {
               rpta = true;
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOException(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println("tecnico disponible: " + rpta);
        return rpta;
    }


    @Override
    public Solicitud actualizarSolicitud(Solicitud vo) throws DAOException {
        String query = "update solicitud set idtecnico=?, estado=?, usuModificacion=?, "
                     + "fechaModificion=? where idsolicitud=?";
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, vo.getTecnico().getIdTecnico());
            stmt.setString(2, vo.getEstado());
            stmt.setString(3, vo.getUsuModificaion());
            stmt.setDate(4, vo.getFechaModificaion());
            stmt.setInt(5, vo.getIdSolicitud());

            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo actualizar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOException(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }
}
